import axios from 'axios'
import Qs from 'qs'
import notification from 'ant-design-vue/es/notification'
const config = require('@/config/settings')

// 创建一个axios请求
const service = axios.create({
  baseURL: config.axios.baseURL,
  timeout: config.axios.timeout, // 请求超时时间60s
  ignoreError: false, // 忽略200服务器返回失败，不提示
  transformRequest: [function (data, headers) {
    if (headers['Content-Type']) {
      if (headers['Content-Type'] === 'multipart/form-data') {
        return data
      } else if (headers['Content-Type'].includes('application/json')) {
        return JSON.stringify(data)
      }
    }
    // 对 data 进行任意转换处理
    return Qs.stringify(data, { indices: false })
  }],
  transformResponse: [function (data) {
    let reponseVal = data
    const hasSecureJsonPrefix = data.startsWith('while')// 返回值添加了防JSON劫持代码
    if (data.startsWith('{') || data.startsWith('[') || hasSecureJsonPrefix) { // 返回值为json
      reponseVal = JSON.parse(hasSecureJsonPrefix ? data.substr(9) : data)
    }
    return reponseVal
  }]
})


/**
 * 请求拦截器----在项目中发请求（请求没有发出去）可以做一些事情
 * @param config 即将发送请求的配置对象
 */

service.interceptors.request.use((config) => {
  // 在发送请求前对get请求做url的处理
  if (config.method.toLocaleLowerCase() === 'get') {
    config.url = config.url + '?' + Qs.stringify(config.query, { indices: false })
  } else {
    if (config.query !== undefined && config.query !== null){
      config.url = config.url + '?' + Qs.stringify(config.query, { indices: false })
    }
  }
  return config
}, error => Promise.reject(error))


//响应拦截器----当服务器手动请求之后，做出响应（相应成功）会执行的
service.interceptors.response.use(
  (response) => {
    const responseData = response.data
    //相应成功做的事情
    if (responseData) {
      responseData.headers = response.headers
      return responseData
    }
  },
  (error) => {
    if (config.axios.openErrorPrompt) {
      err(error)
    } else {
      throw new Error('axios请求异常：' + error)
    }
  }
)


const err = (error) => {
  if (axios.isCancel(error)) {
    return new Promise(() => {})
  }

  if (error.response) {
    switch (error.response.status) {
      case 500:
        notification.error({
          key: 'Error',
          message: '内部错误',
          description: '服务器内部错误，请稍后重新尝试',
          duration: config.axios.errorPromptTime
        })
        break
      case 403:
        notification.error({
          key: 'Forbidden',
          message: '无权限访问',
          description: ((error.response || {}).data || {}).message || '您无权访问该页面',
          duration: config.axios.errorPromptTime
        })
        break
      case 404:
        notification.error({
          key: 'NotFound',
          message: '无法访问',
          description: ((error.response || {}).data || {}).message || '网络异常或服务无法访问，请稍后重新尝试',
          duration: config.axios.errorPromptTime
        })
        break
      case 401:
        notification.error({
          key: 'InvalidSession',
          message: '会话无效',
          description: ((error.response || {}).data || {}).message || '会话失效或已过期，请重新登录',
          duration: config.axios.errorPromptTime
        })
        // if (!unauthorizedConfirm) {
        //   unauthorizedConfirm = modal.confirm({
        //     title: '会话无效',
        //     content: '会话失效或已过期，请重新登录',
        //     onOk () {
        //       store.dispatch('Logout').then((res) => {
        //         store.commit('SET_AUTHORIZED', false)
        //         // 按后端返回跳转
        //         if (process.env.NODE_ENV === 'development') {
        //           if (!window.__POWERED_BY_QIANKUN__) {
        //             location.href = '/user/login'
        //           } else {
        //             location.href = '/jpaas/user/login'
        //           }
        //         } else {
        //           if (res.data.redirecturl) {
        //             location.href = res.data.redirecturl
        //           }
        //         }
        //       })
        //
        //       unauthorizedConfirm = null
        //     },
        //     onCancel () {
        //       unauthorizedConfirm = null
        //     }
        //   })
        // }
        break
      default:
        notification.error({
          key: 'Unknown',
          message: '未知错误',
          description: ((error.response || {}).data || {}).message || '未知错误，请稍后重新尝试',
          duration: config.axios.errorPromptTime
        })
    }
  }
  return Promise.reject(error)
}

// 抛出axios实例
export {
  service
}
